package com.df.my_net_game.net.websocket;


import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import lombok.extern.slf4j.Slf4j;

/**
 * @author wqy
 * @since 2022-08-19
 *
 * 用于监测 channel 的心跳的 handler
 *
 */
@Slf4j
public class NettyHeartBeatHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        // 判断 Event 是否是 IdleStatement (用于触发用户事件, 包含 读空闲|写空闲|读写空闲)
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent event = (IdleStateEvent) evt;
            if (event.state().equals(IdleState.READER_IDLE)) {
                //检查玩家是否登录过了，没登录就把连接关掉
//                Attribute<PlayerInfo> attr = ctx.channel().attr(NetPlayerBridge.PLAYER_INFO);
//                PlayerInfo playerInfo = attr.get();
//                if(playerInfo == null && ctx.channel().isOpen() && ctx.channel().isActive()) {
//                    HandleMsg.offlineMsg(ctx.channel(), "1");
//                    log.info("超过30秒连接未登录，断开连接！");
//                    ctx.close();
//                }
//                log.info("读空闲ing...");
            } else if (event.state().equals(IdleState.WRITER_IDLE)) {
//                log.info("写空闲ing...");
            } else if (event.state().equals(IdleState.ALL_IDLE)) {
                log.info("读写空闲ing...");
                Channel channel = ctx.channel();
                // channel.isActive()-通常用于检查通道是否处于活动状态。活动状态可能表示通道已经建立连接，并且可以进行数据交换
                //                   -可以在通道打开的情况下进行活动状态检查，以确保连接已经建立并且可以正常通信
                // channel.isOpen()-通常用于检查通道是否处于打开状态。如果通道已关闭，那么 isOpen() 返回 false，表示该通道不再接受新的请求或数据
                //                 -通常在打开通道时使用，以确保可以开始进行通信。关闭通道后，将不再接受新的连接或消息
                if (channel.isOpen() && channel.isActive()) {
                    HandleMsg.offlineMsg(channel,"1");

                }
                // 关闭无用channel,减少资源浪费
                ctx.close();
                log.info("HeartBeat Timeout Close Connection");
            }
        }
    }
}
